package lang;

/**
 * @see JDK8JavaArrayMethodNewInstance
 */
public class JDK8JavaObjectMethodGetClass {

    public static void main(String[] args) throws ClassNotFoundException {

        // 如果参数为 Class<?> type （具体的还要看方法里面有没有对type做处理）
        // 可以传入 Class.forName("lang.Employee") 、Employee.class 、employee.getClass()


        // 获取数组的 参照{@link JDK8JavaArrayMethodNewInstance}
        // 可以通过 类名、类、类的对象 获取Class对象

        // 第1种，forName 方式获取Class对象
        // 选中该类，用 Ctrl + alt + Shift 获取类名，然后放到 forName 里面
        Class c1 = Class.forName("lang.Employee");
        // 第2种，直接通过类获取Class对象
        Class c2 = Employee.class;
        // 第3种，通过调用对象的getClass()方法获取Class对象
        Employee employee = new Employee("小明", 18);
        Class c3 = employee.getClass();

        System.out.println(c1.isArray());
        System.out.println(c2.isArray());
        System.out.println(c3.isArray());

        // 可以通过 == 比较Class对象是否为同一个对象
        if (c1 == c2 && c1 == c3) {
            System.out.println("c1、c2、c3 为同一个对象");
            // class lang.Employee
            System.out.println(c1.getName());
            System.out.println(c2.getName());
            System.out.println(c3.getName());
        }

        // 基本数据类型，无法调用 .getClass() 方法
        int intObj = 0;
        Object obj = intObj;
        System.out.println(obj.getClass().getName());
        // 打印结果为java.lang.Integer


    }

    /**
     * 基本数据类型.class
     * 引用类型.getClass()
     *
     * 根据类型名获取类型对象
     * @param typeName  类型名，包括基本数据类型
     * @return 类型对象
     */
    public Class getClassByType(String typeName) {
        switch (typeName) {
            case "boolean":
                return boolean.class;
            case "byte":
                return byte.class;
            case "char":
                return char.class;
            case "short":
                return short.class;
            case "int":
                return int.class;
            case "long":
                return long.class;
            case "float":
                return float.class;
            case "double":
                return double.class;
            default:
                return typeName.getClass();
        }
    }

}
class Employee {

    public final String name;
    public final Integer age;

    public Employee(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
